import { Module, ModuleTree } from 'vuex';

/**
 * 自定义项目 Store Module 类型
 * 为自动导入的 store 做类型限制
 * [@/store文件夹下定义的 store]与[@/views文件夹下定义的`文件store.ts`] 必须继承此类型
 * @author LiQingSong
 */
export interface StoreModuleType<S> extends Module<S, S> {
  namespaced: true;
  name: string;
}

/**
 * 自动导入 Store
 * @author LiQingSong
 */
export function importAllStore<S>(): ModuleTree<S> {
  const modules: ModuleTree<S> = {};
  try {
    // 导入 @/views 下文件，包含子目录，文件名为：store.ts
    const viewsRequireContext: __WebpackModuleApi.RequireContext =
      require.context('../views', true, /[/\\]store\.ts$/);
    viewsRequireContext.keys().forEach((fileName) => {
      // 获取内容
      const modulesConent = viewsRequireContext(fileName);
      if (modulesConent.default) {
        const { name, ...module } = modulesConent.default;
        // 获取 PascalCase 命名
        const modulesName = name || fileName.replace(/^\.\/(.*)\.\w+$/, '$1');

        modules[modulesName] = { ...module };
      }
    });

    // 导入 @/store 下文件
    const requireContext: __WebpackModuleApi.RequireContext = require.context(
      '../store',
      false,
      /\.ts$/
    );
    requireContext.keys().forEach((fileName) => {
      // 获取内容
      const modulesConent = requireContext(fileName);
      if (modulesConent.default) {
        const { name, ...module } = modulesConent.default;
        // 获取 PascalCase 命名
        const modulesName = name || fileName.replace(/^\.\/(.*)\.\w+$/, '$1');

        modules[modulesName] = { ...module };
      }
    });
  } catch (err) {
    console.log(err);
  }

  return modules;
}
